package com.myqf.d7_日期类_druid连接池.dao设计模式2.service.impl;


import com.myqf.d7_日期类_druid连接池.dao设计模式2.User;
import com.myqf.d7_日期类_druid连接池.dao设计模式2.dao.UserDao;
import com.myqf.d7_日期类_druid连接池.dao设计模式2.dao.impl.UserDaoImpl;
import com.myqf.d7_日期类_druid连接池.dao设计模式2.service.UserService;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 作者：黎杭
 * 日期：2020/2/18
 * 这个类就是一个具体实现User业务操作的类
 */
public class UserServiceImpl implements UserService {
    @Override
    public User findUserById(int i) {
        // 业务层就应该去调用数据访问层
        // 创建的接口的实现类

        UserDao userDao = new UserDaoImpl();

        // 根据用户id去查询用户信息
        User u = null;
        try {
            u = userDao.findUserById(i);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return u;
    }

    @Override
    public boolean updateUserById(User user) {
        // 创建一个UserDao实现类
        UserDao userDao = new UserDaoImpl();
        // 注意这里返回的是被影响行数，所以用int接收
        try {
            return userDao.updateUserById(user);// 返回更新的结果
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;// 如果抛出异常，默认返回更新失败
    }

    @Override
    public User findAndUpdate(User userQuery) {
        UserDao userDao = new UserDaoImpl();// 创建一个UserDaoImpl实例
        // 观察发现，我只需要稍微组装以下代码，就能实现很复杂的操作，不用去写得很麻烦
        try {
            User resUser = userDao.findUserById(userQuery.getUserId());// 这是第一步
            if (resUser.getAge() < 25) {// 第二步
                resUser.setName(resUser.getName() + "-年青");
                userDao.updateUserById(resUser);// 第三步
            }
            return resUser;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    // 就会发现业务层方法（业务） 组件化，粒度化（好比每个方法是汽车的零件），就会高度的使用已经做过业务，达到高度重用
    @Override
    public List<User> findAllAndUpdate() {
        // 第一步：把用户查询出来
        UserDao userDao = new UserDaoImpl();// 创建一个Dao实例
        try {
            List<User> users = userDao.findAllUsers();// 查询全部Users,实际开发中一般都禁止查询全部
            List<User> resUserList = new ArrayList<>();
            for (User u : users) {// 谁可以对用户进行判断更名操作？？？？
                // 此时这个u有没有userId？有！有没有名字，有！
                User andUpdate = this.findAndUpdate(u);// 查询或更新，都会得到原本User或者更新之后的User对象
                resUserList.add(andUpdate);
            }
            return resUserList;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}
